<?php


namespace partner\functions\wechat\lib;


use partner\functions\wechat\lib\BaseWechatPartner;
use Exception;

class ContactInfo extends BaseWechatPartner
{
    protected $desensitization_properties = [
        'contact_name',
        'contact_id_number',
        'ubo_id_doc_address',
        'openid',
        'mobile_phone',
        'contact_email'
    ];

    protected $upload_properties = [
        'contact_id_doc_copy' => 1,
        'contact_id_doc_copy_back' => 1,
        'business_authorization_letter' => 1
    ];

    // 超级管理员类型
    // 1、主体为“个体工商户/企业/政府机关/事业单位/社会组织”，
    // 可选择：LEGAL：经营者/法人，SUPER：经办人 。（经办人：经商户授权办理微信支付业务的人员）。
    public $contact_type = '';

    private $allowed_contact_type = ['LEGAL', 'SUPER'];

    // 超级管理员姓名 该字段需进行加密处理 参考: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/wechatpay/wechatpay4_3.shtml
    public $contact_name = '';

    public $contact_id_doc_type = '';

    private $allowed_contact_id_doc_type = [
        // 中国大陆居民-身份证
        'IDENTIFICATION_TYPE_IDCARD',
        // 其他国家或地区居民-护照
        'IDENTIFICATION_TYPE_OVERSEA_PASSPORT',
        // 中国香港居民-来往内地通行证
        'IDENTIFICATION_TYPE_HONGKONG_PASSPORT',
        // 中国澳门居民-来往内地通行证
        'IDENTIFICATION_TYPE_MACAO_PASSPORT',
        // 中国台湾居民-来往大陆通行证
        'IDENTIFICATION_TYPE_TAIWAN_PASSPORT',
        // 外国人居留证
        'IDENTIFICATION_TYPE_FOREIGN_RESIDENT',
        // 港澳居民证
        'IDENTIFICATION_TYPE_HONGKONG_MACAO_RESIDENT',
        // 台湾居民证
        'IDENTIFICATION_TYPE_TAIWAN_RESIDENT'
    ];

    // 当超级管理员类型是经办人时，请上传超级管理员证件号码
    // 超级管理员签约时，校验微信号绑定的银行卡实名信息，是否与该证件号码一致。
    // 该字段需进行加密处理
    public $contact_id_number = '';

    // 超级管理员证件正面照片
    // 当超级管理员类型是经办人时，请上传超级管理员证件的正面照片。
    // 若证件类型为身份证，请上传人像面照片
    public $contact_id_doc_copy = '';

    // 超级管理员证件反面照片
    // 当超级管理员类型是经办人时，请上传超级管理员证件的反面照片。
    // 若证件类型为护照，无需上传反面照片
    public $contact_id_doc_copy_back = '';

    // 超级管理员证件有效期开始时间
    // 当超级管理员类型是经办人时，请上传证件有效期开始时间。
    public $contact_period_begin = '';

    // 超级管理员证件有效期结束时间
    // 当超级管理员类型是经办人时，请上传证件有效期结束时间。
    public $contact_period_end = '';

    // 业务办理授权函
    // 当超级管理员类型是经办人时，请上传业务办理授权函。
    public $business_authorization_letter = '';

    // 超级管理员签约时，会校验微信号是否与该微信OpenID一致；
    public $openid = '';

    // 输入11位数字 该字段需进行加密处理
    public $mobile_phone = '';

    // 联系邮箱 小微选填，个体工商户/企业/党政、机关及事业单位/其他组织必填
    // 所以必填!
    public $contact_email = '';

    public function getAllowedContactType()
    {
        return $this->allowed_contact_type;        
    }

    public function getAllowedContactIdType() 
    {
        return $this->allowed_contact_id_doc_type;
    }


    public function setContactEmail(string $contact_email = '')
    {
        if (empty($contact_email))
            throw new Exception("联系邮箱不能为空");

        $this->contact_email = $contact_email;
        return $this;
    }

    public function setMobilePhone(string $mobile_phone = '')
    {
        if (empty($mobile_phone))
            throw new Exception("手机号码不能为空");

        $this->mobile_phone = $mobile_phone;
        return $this;
    }


    public function setOpenId(string $openid = '')
    {
        $this->openid = $openid;
        return $this;
    }


    public function setBusinessAuthorizationLetter(string $business_authorization_letter = '')
    {
        if ($business_authorization_letter) {
            if (! file_exists($business_authorization_letter))
                throw new Exception("业务办理授权函不存在");

            $this->business_authorization_letter = $business_authorization_letter;
        }
        return $this;
    }

    
    public function setContactPeriodEnd(string $contact_period_end = '')
    {
        if ($this->contact_period_begin) {
            $begin = strtotime($this->contact_period_begin);
            $end = strtotime($contact_period_end);
            if ($end <= $begin)
                throw new Exception("超级管理员证件有效期有误");
        }
        $this->contact_period_end = $contact_period_end;
        return $this;
    }

    
    public function setContactPeriodBegin(string $contact_period_begin = '')
    {
        if ($this->contact_period_end) {
            $begin = strtotime($contact_period_begin);
            $end = strtotime($this->contact_period_end);
            if ($end <= $begin)
                throw new Exception("超级管理员证件有效期有误");
        }
        $this->contact_period_begin = $contact_period_begin;
        return $this;
    }


    public function setContactIdDocCopyBack(string $contact_id_doc_copy_back)
    {
        if ($contact_id_doc_copy_back) {
            if (! file_exists($contact_id_doc_copy_back))
                throw new Exception('超级管理员证件反面照片不存在');
    
            $this->contact_id_doc_copy_back = $contact_id_doc_copy_back;
        }
        return $this;
    }

    public function setContactIdDocCopy(string $contact_id_doc_copy)
    {
        if ($contact_id_doc_copy) {
            if (! file_exists($contact_id_doc_copy))
                throw new Exception('超级管理员证件正面照片不存在');
    
            $this->contact_id_doc_copy = $contact_id_doc_copy;
        }
        return $this;
    }

    public function setContactIdNumber(string $contact_id_number = '')
    {
        if ($contact_id_number) {
            if (empty($contact_id_number))
                throw new Exception('超级管理员身份证件号码不能为空');

            $this->contact_id_number = $contact_id_number;
        }
        return $this;
    }
}